﻿using System;
using System.Collections.Generic;
using System.Text;
using BCDto.Chats.Thread;

namespace BCService.Chats
{
    /// <summary>
    /// 会话相关接口。
    /// </summary>
    public interface IThreadService
    {
        /// <summary>
        /// 获取会话列表。
        /// </summary>
        /// <returns></returns>
        IEnumerable<ThreadDto> GetThreads();

        /// <summary>
        /// 获取指定的会话。
        /// </summary>
        /// <param name="threadId">会话编号。</param>
        /// <returns></returns>
        ThreadDto GetThread(long threadId);

        /// <summary>
        /// 创建新会话。
        /// </summary>
        /// <param name="requestDto"></param>
        /// <param name="threadIsNew">会话是新创建的。</param>
        /// <returns>私人会话、客服会话在参数相同的情况下，可能并不会重复创建新会话，当有新会话创建时 <paramref name="threadIsNew"/> 返回 <c>true</c>，否则返回 <c>false</c>。</returns>
        ThreadDto Create(ThreadRequestDto requestDto, out bool threadIsNew);

        /// <summary>
        /// 修改指定的会话。
        /// </summary>
        /// <param name="threadId">会话编号。</param>
        /// <param name="requestDto"></param>
        /// <returns></returns>
        ThreadDto Update(long threadId, ThreadUpdateRequestDto requestDto);

        /// <summary>
        /// 关闭会话。
        /// </summary>
        /// <param name="threadId">会话编号。</param>
        /// <param name="requestDto"></param>
        /// <returns></returns>
        ThreadDto Close(long threadId, ThreadCloseRequestDto requestDto);

        /// <summary>
        /// 删除会话。
        /// </summary>
        /// <param name="threadId">会话编号。</param>
        void Delete(long threadId);

        /// <summary>
        /// 将指定的会话/消息标记为已读。
        /// </summary>
        /// <param name="threadId">会话编号。</param>
        /// <param name="requestDto"></param>
        /// <returns></returns>
        ThreadDto MarkAsRead(long threadId, MarkAsReadRequestDto requestDto);

        /// <summary>
        /// 添加会话参与人。
        /// </summary>
        /// <param name="threadId">会话编号。</param>
        /// <param name="requestDto"></param>
        /// <returns></returns>
        ThreadDto AttachParticipants(long threadId, AttachParticipantsRequestDto requestDto);

        /// <summary>
        /// 移除会话参与人。
        /// </summary>
        /// <param name="threadId">会话编号。</param>
        /// <param name="requestDto"></param>
        /// <returns></returns>
        ThreadDto DetachParticipants(long threadId, DetachParticipantsRequestDto requestDto);
    }
}
